package com.wongoing.sys.action;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.wongoing.sys.model.SysPermission;
import com.wongoing.sys.model.SysUser;
import com.wongoing.sys.model.ext.SysPermissionExt;
import com.wongoing.sys.service.SysPermissionService;
import com.wongoing.sys.service.SysUserService;
import com.wongoing.sys.viewmodel.JsonResult;
import com.wongoing.util.Constants;
import com.wongoing.util.LogService;
import com.wongoing.util.ModelAndViewConstants;
import com.wongoing.util.Status;


@Controller
@RequestMapping("/sys/sysPermissionAction")
public class SysPermissionAction extends BaseAction{
	
	private SysPermissionService service;
	private SysUserService sysUserService;

	@Autowired
	public void setService(SysPermissionService service) {
		this.service = service;
	}
	
	@Autowired
	public void setSysUserService(SysUserService sysUserService) {
		this.sysUserService = sysUserService;
	}
	/**
	 * 功能说明：进入列表显示界面
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:48:53
	 * @return
	 */
	@RequestMapping(value = "/toList")
	public ModelAndView toList(){
		ModelAndView mv = null;
		try {
			String status = "0";
			String isUsed = "Y";
			List<SysPermissionExt> list = this.service.getPermissionListByParam(status, isUsed);
			List<SysPermissionExt> result = new ArrayList<SysPermissionExt>();
			for (SysPermissionExt speOne : list) {
				if(speOne.getParentId() == null){
					result.add(speOne);
					for (SysPermissionExt speTwo : list) {
						if(speOne.getId().equals(speTwo.getParentId())){
							result.add(speTwo);
							for (SysPermissionExt speThree : list) {
								if(speTwo.getId().equals(speThree.getParentId())){
									result.add(speThree);
								}
							}
						}
					}
				}
			}
			mv = new ModelAndView();
			mv.addObject(ModelAndViewConstants.PERMISSION_LIST, result);
			mv.setViewName(ModelAndViewConstants.PERMISSION_MAIN_VIEW);
			LogService.getInstance(this).debug("获取权限列表成功："+ModelAndViewConstants.PERMISSION_MAIN_VIEW);
		} catch (Exception ex) {
			LogService.getInstance(this).error("获取权限列表失败：" + ex.getMessage(), ex);
			mv = new ModelAndView(ModelAndViewConstants.ERROR_VIEW);
		}
		return mv;
	}
	/**
	 * 功能说明：执行权限编码验证操作
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:47:48
	 * @param op
	 * @param original
	 * @param sysId
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/doSysIdValidate")
	public Map<String,Object > doSysIdValidate(String op,String original,String sysId){
		Map<String,Object> jsonResult = null;
		try {
			String where = " BINARY SysId='"+sysId+"' and Status='0' and IsUsed='Y' ";
			List<SysPermission> list = this.service.getByWhere(where);
			if(list!=null){
				int count = list.size();
				switch (count) {
				case 0:
					jsonResult = JsonResult.jsonValidateReturn(true, "验证通过，该权限编码可以使用");
					LogService.getInstance(this).debug("该权限编码验证通过，可使用");
					break;
				case 1:
					if(ModelAndViewConstants.OPERATION_VALUE_EDIT.equals(op)){
						if(sysId.equals(original)){
							jsonResult = JsonResult.jsonValidateReturn(true, "验证通过，该权限编码可以使用");
							LogService.getInstance(this).debug("该权限编码名验证通过，可使用");
						}else{
							jsonResult = JsonResult.jsonValidateReturn(false, "该权限编码已被使用");
							LogService.getInstance(this).debug("该权限编码名被使用，不可使用");
						}
					}else{
						jsonResult = JsonResult.jsonValidateReturn(false, "该权限编码名称已被使用");
						LogService.getInstance(this).debug("该权限编码名称已被使用");
					}
					break;
				default:
					jsonResult = JsonResult.jsonValidateReturn(false, "该权限编码已被使用");
					LogService.getInstance(this).debug("权限编码已被使用");
					break;
				}
			}else{
				jsonResult = JsonResult.jsonValidateReturn(false, "验证失败");
				LogService.getInstance(this).error("权限编码验证失败");
			}
		} catch (Exception e) {
			jsonResult = JsonResult.jsonValidateReturn(false, "验证失败");
			LogService.getInstance(this).error("权限编码验证失败");
		}
		return jsonResult;
	}
	/**
	 * 功能说明：执行权限名称验证操作
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:48:22
	 * @param op
	 * @param original
	 * @param name
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/doNameValidate")
	public Map<String,Object > doNameValidate(String op,String original,String name){
		System.out.println("name的值"+name+"op的值"+op+"original的值"+original);
		
		Map<String,Object> jsonResult = null;
		try {
			String where = " BINARY Name = '" + name + "' and Status='0' and IsUsed='Y' ";
			List<SysPermission> list = this.service.getByWhere(where);
			if(list!=null){
				Integer count = list.size();
				switch (count) {
				case 0:
					jsonResult = JsonResult.jsonValidateReturn(true, "验证通过，该权限名称可以使用");
					LogService.getInstance(this).debug("该权限名称验证通过，可使用");
					break;
				case 1:
					if(ModelAndViewConstants.OPERATION_VALUE_EDIT.equals(op)){
						if(name.equals(original)){
							jsonResult = JsonResult.jsonValidateReturn(true, "验证通过，该权限名称可以使用");
							LogService.getInstance(this).debug("该权限名验证通过，可使用");
						}else{
							jsonResult = JsonResult.jsonValidateReturn(false, "该权限名称已被使用");
							LogService.getInstance(this).debug("该权限名称被使用，不可使用");
						}
					}else{
						jsonResult = JsonResult.jsonValidateReturn(false, "该权限名称已被使用");
						LogService.getInstance(this).debug("该权限名称已被使用用，不可使用");
					}
					break;
				default:
					jsonResult = JsonResult.jsonValidateReturn(false, "该权限名称已被使用");
					LogService.getInstance(this).debug("权限名称已被使用，不可使用");
					break;
				}
			}else{
				jsonResult = JsonResult.jsonValidateReturn(false, "验证失败");
				LogService.getInstance(this).error("权限名称验证失败");
			}
		} catch (Exception e) {
			jsonResult = JsonResult.jsonValidateReturn(false, "验证失败");
			LogService.getInstance(this).error("权限名称验证失败");
		}
		return jsonResult;
	}
	/**
	 * 功能说明：进入添加界面
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:49:42
	 * @return
	 */
	@RequestMapping(value = "/toAdd")
	public ModelAndView toAdd(){
		ModelAndView mv = null;
		try {
			String status = "0";
			String isUsed = "Y";
			List<SysPermissionExt> treeNodes = this.service.getPermissionListByParam(status, isUsed);		
			mv = new ModelAndView();
			mv.addObject(ModelAndViewConstants.OPERATION_KEY, ModelAndViewConstants.OPERATION_VALUE_ADD);
			mv.addObject(ModelAndViewConstants.TITLE_KEY, "添加权限");
			mv.addObject(ModelAndViewConstants.TREE_NODES_MODEL, OutputJson(treeNodes));
			mv.setViewName(ModelAndViewConstants.PERMISSION_EDIT_VIEW);
			LogService.getInstance(this).debug("进入权限添加页："+ModelAndViewConstants.PERMISSION_EDIT_VIEW);
		} catch (Exception ex) {
			LogService.getInstance(this).error("权限插入失败：" + ex.getMessage(), ex);
			mv = new ModelAndView(ModelAndViewConstants.ERROR_VIEW);
		}
		return mv;
	}
	
	/**
	 * 功能说明：进入编辑界面
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:50:12
	 * @param id
	 * @return
	 */
	@RequestMapping(value="/toEdit")
	public ModelAndView toEdit(Integer id){
		ModelAndView mv = null;
		try {
			String status = "0";
			String isUsed = "Y";
			List<SysPermissionExt> list = this.service.getPermissionListByParam(status, isUsed);
			SysPermission permission = this.service.getByPrimaryKey(id);
			List<SysPermissionExt> treeNodes = new ArrayList<SysPermissionExt>();
			for (SysPermissionExt spe : list) {
				spe.setChecked(false);
				if(permission.getId().equals(spe.getId())){
					spe.setChecked(true);
				}
				treeNodes.add(spe);
			}
			mv = new ModelAndView();
			mv.addObject(ModelAndViewConstants.OPERATION_KEY,ModelAndViewConstants.OPERATION_VALUE_EDIT);
			mv.addObject(ModelAndViewConstants.PERMISSION_MODEL, permission);
			mv.addObject(ModelAndViewConstants.TREE_NODES_MODEL, OutputJson(treeNodes));
			mv.addObject(ModelAndViewConstants.TITLE_KEY, "修改权限");
			mv.setViewName(ModelAndViewConstants.PERMISSION_EDIT_VIEW);
			LogService.getInstance(this).debug("进入角色编辑页："+ModelAndViewConstants.PERMISSION_EDIT_VIEW);
		} catch (Exception ex) {
			LogService.getInstance(this).error("角色编辑失败：" + ex.getMessage(), ex);
			mv = new ModelAndView(ModelAndViewConstants.ERROR_VIEW);
		}
		return mv;
	}
	/**
	 * 功能说明： 进入删除界面
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:50:32
	 * @param id
	 * @return
	 */
	@RequestMapping(value = "/toDel")
	public ModelAndView toDel(Integer id){
		ModelAndView mv = null;
		try {
			mv = new ModelAndView();
			SysPermission perm = new SysPermission();
			perm.setId(id);
			perm.setStatus(Constants.PERSISTENCE_DELETE_STATUS);
			Map<String,Object> param = new HashMap<String, Object>();
			param.put("status", "0");
			param.put("isUsed", "Y");
			//1.查询所有正常状态的权限
			List<SysPermission> all = this.service.getByParam(param);
			param.put("id", id);
			//2.查询选中状态的一条权限
			List<SysPermission> single = this.service.getByParam(param);
			//3.判断该条权限的等级，如果有下级则收入之，没有则为最下级
			List<SysPermission> result = new ArrayList<SysPermission>();
			if(single.get(0).getParentId() == null){
				result.add(single.get(0));
				//获取二级目录
				for (SysPermission level2 : all) {
					if(single.get(0).getId().equals(level2.getParentId())){
						result.add(level2);
						//获取三级
						for (SysPermission level3 : all) {
							if(level2.getId().equals(level3.getParentId())){
								result.add(level3);
							}
						}
					}
				}
			}else{
				//3.2 二级目录判断
				result.add(single.get(0));
				for(SysPermission level3 : all){
					//3.3子集目录
					if(single.get(0).getId().equals(level3.getParentId())){
						result.add(level3);
					}
				}
			}
			String str = "";
			for (SysPermission s : result) {
				str += s.getId()+",";
			}
			String idStr = str.substring(0, str.length()-1);
			mv.addObject(ModelAndViewConstants.PERMISSION_LIST, idStr);
			mv.addObject(ModelAndViewConstants.TITLE_KEY, "权限删除信息确认");	
			if(result.size()>1){
				mv.addObject(ModelAndViewConstants.CONTENT, single.get(0).getName()+"权限下有子集，删除该权限会连同子集一起删除。请确认是否删除？");	
			}else{
				mv.addObject(ModelAndViewConstants.CONTENT, "您要删除'"+single.get(0).getName()+"'权限吗？确定请点击“确定”按钮删除");
			}
			mv.setViewName(ModelAndViewConstants.PERMISSION_DEL_VIEW);
			LogService.getInstance(this).debug("获取权限删除确认信息成功："+ModelAndViewConstants.PERMISSION_DEL_VIEW);
		}catch (Exception e) {
			mv.setViewName(ModelAndViewConstants.ERROR_VIEW);
			LogService.getInstance(this).debug("权限删除确认信息失败："+ModelAndViewConstants.PERMISSION_DEL_VIEW);
		}
		return mv;
	}
	/**
	 * 功能说明：执行删除操作，权限删除操作，实际调用的update方法
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:51:15
	 * @param idStr
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/doDel")
	public Map<String,Object> doDel(String idStr){
		Map<String, Object> jsonResult = null;
		try {
			String tabid = tabid(ModelAndViewConstants.PERMISSION_SYS_ID);
			String[] idStrArr = idStr.split(",");
			List<SysPermission> list = new ArrayList<SysPermission>();
			for (String id : idStrArr) {
				SysPermission sp = new SysPermission();
				sp.setId(Integer.parseInt(id));
				sp.setStatus("1");
				sp.setIsUsed("N");
				list.add(sp);
			}
			Integer count = this.service.updateBatch(list);
			if (count > 0) {
				String msg = "权限删除成功";
				jsonResult = JsonResult.jsonReturn(Status.OK.getCode(), msg,tabid);
				LogService.getInstance(this).debug("删除权限成功!" + count);
			} else {
				Integer statusCode = 300;
				String msg = "权限删除失败";
				jsonResult = JsonResult.jsonReturn(statusCode.intValue(), msg, tabid);
				LogService.getInstance(this).debug("删除权限失败!count-->" + count);
			}
		} catch (Exception e) {
			String msg = "权限删除失败";
			jsonResult = JsonResult.jsonReturnErr(msg);
			LogService.getInstance(this).debug("删除权限失败!count-->" + e.getMessage());
		}
		return jsonResult;
	}
	/**
	 * 功能说明：执行保存操作
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:51:43
	 * @param entity
	 * @param op
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/doSave")
	public Map<String,Object> doSave(SysPermission entity,String op){
		Map<String, Object> jsonResult = null;
		try {
			boolean flag = false;//是否存在下一级的标识量
			Map<String,Object> permissionParam = new HashMap<String, Object>();
			permissionParam.put("status","0");
			permissionParam.put("isUsed","Y");
			List<SysPermission> list =  this.service.getByParam(permissionParam);//获取所有可用的菜单集合
			List<SysPermission> single = new ArrayList<SysPermission>();
			if(null == entity.getParentId()){//如果保存菜单没有父级菜单，则直接保存到single集合中
				single.add(entity);
			}else{//如果保存菜单有父级菜单，则获取其父级菜单到single集合中
				permissionParam.put("id", entity.getParentId());
				single = this.service.getByParam(permissionParam);
			}
			if(list!=null && !list.isEmpty() && single!=null && !single.isEmpty()){
				List<SysPermission> level2 = new ArrayList<SysPermission>();
				for (SysPermission speOne : list) {//遍历出所有二级菜单保存到level2集合中
					if(speOne.getParentId() == null){
						for (SysPermission speTwo : list) {
							if(speOne.getId().equals(speTwo.getParentId())){
								level2.add(speTwo);
							}
						}
					}
				}
				if(single.get(0).getParentId()==null){//如果父级菜单没有上级则flag = true
					flag = true;
				}else{
					for (SysPermission l2 : level2) {
						if(single.get(0).getId().equals(l2.getId())){
							flag = true;
						}
					}
				}
				//判断父类权限的等级，若为最小级菜单，则不可在分割
				if(flag){
					//获取当前用户的id
					String tabid = tabid(ModelAndViewConstants.PERMISSION_SYS_ID);
					Subject subject = SecurityUtils.getSubject();
					String currentName = subject.getPrincipal().toString();
					Map<String, Object> param = new HashMap<String, Object>();
					param.put("account", currentName);
					List<SysUser> user = this.sysUserService.getByParam(param);
					if(user!=null && !user.isEmpty()){
						entity.setModifyDate(new Date());
						entity.setModifyUser(user.get(0).getId());
						//添加操作
						if(ModelAndViewConstants.OPERATION_VALUE_ADD.equals(op)){
							entity.setCreateUser(user.get(0).getId());
							entity.setCreateDate(new Date());
							entity.setIsUsed("Y");		
							entity.setState("open");//可能会删除该属性	
							entity.setIconCls("");	
							entity.setStatus("0");
							Integer count = this.service.insert(entity);
							if(count>0){
								Integer statusCode = 200;
								String msg = "权限添加成功";
								jsonResult = JsonResult.jsonReturn(statusCode.intValue(), msg, tabid);
								LogService.getInstance(this).debug("添加权限成功!");
							}else{
								String msg = "权限添加失败";
								jsonResult = JsonResult.jsonReturnErr(msg);
								LogService.getInstance(this).debug("添加权限失败!count-->"+count);
							}
						}else{
							//修改操作
							Integer count = this.service.updateByPrimaryKey(entity);
							if(count>0){
								Integer statusCode = 200;
								String msg = "权限修改成功";
								jsonResult = JsonResult.jsonReturn(statusCode.intValue(), msg, tabid);
								LogService.getInstance(this).debug("修改权限成功!");
							}else{
								String msg = "权限修改失败";
								jsonResult = JsonResult.jsonReturnErr(msg);
								LogService.getInstance(this).debug("权限修改失败!count-->"+count);
							}
						}
					}else{
						String msg = "保存权限信息失败！您登录的当前帐号有问题，请重新登录进行尝试。";
						jsonResult = JsonResult.jsonReturnErr(msg);
						LogService.getInstance(this).debug("保存权限信息失败！您登录的当前帐号有问题，请重新登录进行尝试。");
					}
				}else{
					jsonResult = JsonResult.jsonReturnErr("'"+entity.getParentName()+"'为最小权限，不可作为父级权限！");
					LogService.getInstance(this).debug("'"+entity.getParentName()+"为最小权限，不可作为父级权限！");
				}
			}else{
				String msg = "保存权限信息失败";
				jsonResult = JsonResult.jsonReturnErr(msg);
				LogService.getInstance(this).debug("保存权限信息失败!权限列表数据或选中行数据获取有问题");
			}
		} catch (Exception e) {
			String msg = "保存权限信息失败";
			jsonResult = JsonResult.jsonReturnErr(msg);
			LogService.getInstance(this).debug("保存权限信息失败!"+e.getMessage());
		}
		return jsonResult;
	}
}
